/*
 * == Loiseau Lucien & Vincent Thomas
 * Implémentation de la classe de Service de transformation de grille de dimensions 2.
 */
 
#include "../include/Transformation.h" 
 
/*
 * grille -> void
 * Cette fonction prend une grille en paramètre et lui applique une gravite ce qui a pour effet
 * d'empiler tout les jetons vers le bas.
 */ 
void Transformation::Applique_gravite(Grille* grille){
	for(int i = 0; i < grille->getColonnes(); i++){
		int base = grille->getLignes()-1;
		for(int j = grille->getLignes()-1; j >= 0; j--){
			if((grille->_grille[i][j]->_jeton != VIDE)){
				if(j != base){
					grille->_grille[i][base]->_jeton = grille->_grille[i][j]->_jeton;
					grille->_grille[i][j]->_jeton = VIDE;
				}
				base--;
			}
		}
	}
}

/*
 * grille * integer * couleur -> void
 * Cette fonction ajoute un jeton d'une certaine couleur dans la colonne de la grille
 */
void Transformation::Ajoute_jeton(Grille* grille, int colonne, Couleur couleur){
	if( colonne > grille->getColonnes()-1 ) return;
	int i = grille->getLignes()-1;
	while((grille->_grille[colonne][i]->_jeton != VIDE) && (i >= 0))
		i--;
	if(i >= 0 ) grille->_grille[colonne][i]->_jeton = couleur;
}


/*
 * Cette fonction applique un quart de rotation  vers la droite sur une grille
 */
void Transformation::Rotation_quart_de_tour_droite(Grille* grille){
	/*
	 * On effectue la rotation qu'on stock dans temp
	 */
	Case temp[grille->getColonnes()][grille->getLignes()];
	for(int i = 0; i < grille->getColonnes(); i++){
		for(int j = 0; j < grille->getLignes(); j++){
			temp[grille->getLignes()-1-j][i]._jeton = grille->_grille[i][j]->_jeton;
		}
	}	
	/*
	 * on remet à jour grille
	 */
	for(int i = 0; i < grille->getColonnes(); i++){
		for(int j = 0; j < grille->getLignes(); j++){
			grille->_grille[i][j]->_jeton = temp[i][j]._jeton;
		}
	}
}

/*
 * Cette fonction applique un quart de rotation  vers la droite sur une grille
 */
void Transformation::Rotation_quart_de_tour_gauche(Grille* grille){
	/*
	 * On effectue la rotation qu'on stock dans temp
	 */
	Case temp[grille->getColonnes()][grille->getLignes()];
	for(int i = 0; i < grille->getColonnes(); i++){
		for(int j = 0; j < grille->getLignes(); j++){
			temp[j][grille->getColonnes()-1-i]._jeton = grille->_grille[i][j]->_jeton;
		}
	}	
	/*
	 * on remet à jour grille
	 */
	for(int i = 0; i < grille->getColonnes(); i++){
		for(int j = 0; j < grille->getLignes(); j++){
			grille->_grille[i][j]->_jeton = temp[i][j]._jeton;
		}
	}
}

void Transformation::Rotation_demi_tour(Grille* grille){
	/*
	 * On effectue la rotation qu'on stock dans temp
	 */
	Case temp[grille->getColonnes()][grille->getLignes()];
	for(int i = 0; i < grille->getColonnes(); i++){
		for(int j = 0; j < grille->getLignes(); j++){
			temp[i][grille->getLignes()-1-j]._jeton = grille->_grille[i][j]->_jeton;
		}
	}	
	/*
	 * on remet à jour grille
	 */
	for(int i = 0; i < grille->getColonnes(); i++){
		for(int j = 0; j < grille->getLignes(); j++){
			grille->_grille[i][j]->_jeton = temp[i][j]._jeton;
		}
	}
}













